package tuling.netty.quickstart;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.nio.charset.StandardCharsets;

/**
 * @author RenGaoshuai
 * @date 2023/11/30 9:49
 * @description
 */
public class QuickStartServerHandler extends ChannelInboundHandlerAdapter {


    //客户端再连接上服务端口发送数据”heelServer

    //服务端接收到数据并打印出来，服务端发送数据HelloClient


    /**
     * 读取通道中的数据（读取客户端发送过来的数据）
     * @param ctx 上下文
     * @param msg 数据
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //这个对象是netty专门处理消息存储的对象
        ByteBuf buffer = (ByteBuf) msg;
        String s = buffer.toString(StandardCharsets.UTF_8);
        System.out.println("服务端接收到客户端发送的消息："+s);
    }

    /**
     *读取完通道中的数据会出发该方法
     * @param ctx 上下文
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ByteBuf byteBuf = Unpooled.copiedBuffer("HelloClient,I`m server", CharsetUtil.UTF_8);
        //将消息写入到通道并刷新（客户端可以读取此通道中的数据）
        ctx.writeAndFlush(byteBuf);

    }

    /**
     * 程序出现异常会触发该方法
     * 一般都是关闭通道
     * @param ctx 上下文
     * @param cause 异常
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //关闭通道
        ctx.close();
    }
}
